// 本文件用于业务处理
#pragma once
#include "protocol.hpp"

enum
{
    Correct = 1,
    DivZero,
    ModZero,
    Unknow
};

class Calculate
{
public:
    Calculate(int data_x, int data_y, char oper)
        : _data_x(data_x), _data_y(data_y), _oper(oper), _result(0), _stat(0)
    {}
    ~Calculate(){}
    
    // 运算
    std::unique_ptr<Response> Compute()
    {
        switch (_oper)
        {
        case '+':
        {
            _result = _data_x + _data_y;
        }
        break;
        case '-':
        {
            _result = _data_x - _data_y;
        }
        break;
        case '*':
        {
            _result = _data_x * _data_y;
        }
        break;
        case '/':
        {
            if (_data_y == 0)
            {
                _stat = DivZero;
            }
            else
                _result = _data_x / _data_y;
        }
        break;
        case '%':
        {
            if (_data_y == 0)
            {
                _stat = ModZero;
            }
            else
                _result = _data_x % _data_y;
        }
        break;
        default:
        {
            _stat = Unknow;
        }
        break;
        }
        return std::make_unique<Response>(_result, _stat);
    }

private:
    int _data_x;
    int _data_y;
    char _oper;
    int _result;
    int _stat;
};